package db.entity;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Iterator;

import db.BaseDAO;
import db.DAOFactory;
import db.Transaction;
import db.TransformInterface;

import model.Node;
import model.Activity;
import model.Spot;
import model.relation.ActivitySpots;

/**
 * 
 * Description: 对民俗活动数据进行处理的DAO。
 * 
 * @since  2009/2/22
 * @author ashen
 * 
 */
public class ActivityDAO extends BaseDAO implements TransformInterface<Activity>{
	
	public ActivityDAO(){
		setTableName("mapscheme.activity");
	}
	
	/**
	 * the method save of class ActivityDAO
	 * 
	 * 该方法将参数民俗活动对象存储到数据库
	 * 
	 * @param activity 需要保存的Activity对象
	 * @return 返回操作成功与否
	 */
	public boolean save(Activity activity){
		Transaction transaction=new Transaction();
		Node node=activity.toNode();
		if(!DAOFactory.getNodeDAO("activity").save(node))
			return false;
		int id=
			DAOFactory.getNodeDAO().findByName(activity.getName(),transaction).getId();
		activity.setId(id);
		save(object2HashMap(activity),transaction);
		
		ArrayList<Spot> spots=activity.getSpots();	
		ActivitySpots apset=null;
		if(spots!=null&&!spots.isEmpty())
			for(Iterator i=spots.iterator();i.hasNext();){
				apset=new ActivitySpots(id,(Spot)i.next());
				DAOFactory.getActivitySpotsDAO().save(apset,transaction);
			}
		if(transaction.commit())
			return true;
		else{
			DAOFactory.getNodeDAO().delete(id);
			return false;
		}	
	}
	
	/**
	 * the method update of class ActivityDAO 
	 * 
	 * 该方法将参数民俗活动对象更新到数据库
	 * 
	 * @param activity 需要更新的Activity对象
	 * @return 返回操作成功与否
	 */
	public boolean update(Activity activity){
		Transaction transaction=new Transaction();
		Node node=activity.toNode();
		DAOFactory.getNodeDAO("activity").update(node,node.getId(),transaction);
		System.out.println(node.getId());
		update(object2HashMap(activity),"ID",node.getId(),transaction);
		
		//删除Activityspots表中与删除的民俗活动相关的关系记录
		DAOFactory.getActivitySpotsDAO().delete(activity.getId(),transaction);
		ArrayList<Spot> spots=activity.getSpots();	
		int id=activity.getId();
		ActivitySpots apset=null;
		if(!spots.isEmpty())
			for(Iterator i=spots.iterator();i.hasNext();){
				apset=new ActivitySpots(id,(Spot)i.next());
				DAOFactory.getActivitySpotsDAO().save(apset,transaction);
			}
		return transaction.commit();
	}
	
	/**
	 * the method delete of class ActivityDAO
	 * 
	 * 该方法删除指定ID的民俗活动
	 * 
	 * @param id 需要删除的民俗活动的ID
	 * @return 返回操作成功与否
	 */
	public boolean delete(int id){
		return DAOFactory.getNodeDAO().delete("id",id);
	}
	
	/**
	 * the method findAll of class ActivityDAO
	 * 
	 * 该方法返回所有民俗活动
	 * 
	 * @return ArrayList<Activity>类型，返回数据中所有民俗活动
	 */
	public ArrayList<Activity> findAll(){
		Activity activity=null;
		Node node=null;
		Transaction transaction=new Transaction();
		ArrayList<Activity> resultList=new ArrayList<Activity>();
		ArrayList<Node> nodeList=DAOFactory.getNodeDAO().findByType("activity", transaction);
		for(Iterator<Node> i=nodeList.iterator();i.hasNext();){
			node=(Node)i.next();
			activity=this.findById(node.getId(),transaction);
			activity.setActivity(node);
			resultList.add(activity);
		}
		transaction.close();
		return resultList;
	}

	/**
	 * the method findById of class ActivityDAO
	 * 
	 * 该方法通过指定民俗活动ID查找民俗活动
	 * 
	 * @param id 民俗活动ID
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的民俗活动
	 */
	public Activity findById(int id,Transaction transaction){	
		Activity activity= hashMap2Object(findByPK("id",id,transaction));
		if(activity!=null)
			activity.setActivity(DAOFactory.getNodeDAO().findById(id,transaction));
        return activity;
	}
	
	/**
	 * the method findById of class ActivityDAO
	 * 
	 * 该方法通过指定民俗活动ID查找民俗活动
	 * 
	 * @param id 民俗活动ID
	 * @return 查询到的民俗活动
	 */
	public Activity findById(int id){	
		Transaction transaction=new Transaction();
		Activity activity= this.findById(id, transaction);
        transaction.close();
        return activity;
	}
	
	/**
	 * the method findByName of class ActivityDAO
	 * 
	 * 该方法通过指定民俗活动名称查找民俗活动,民俗活动名称唯一
	 * 
	 * @param name 民俗活动名称
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的民俗活动
	 */
	public Activity findByName(String name,Transaction transaction){
		Activity activity=null;
		Node node=DAOFactory.getNodeDAO().findByName(name, transaction);
		if(node!=null)
			activity=this.findById(node.getId(),transaction);
		if(activity!=null)
			activity.setActivity(node);
		else
			return null;
		return activity;
	}
	
	/**
	 * the method findByName of class ActivityDAO
	 * 
	 * 该方法通过指定民俗活动名称查找民俗活动,民俗活动名称唯一
	 * 
	 * @param name 民俗活动名称
	 * @return 查询到的民俗活动
	 */
	public Activity findByName(String name){
		Transaction transaction =new Transaction();
		Activity activity=this.findByName(name,transaction);
		transaction.close();
		return activity;
	}
	
	/**
	 * the method findByKeyword of class ActivityDAO
	 * 
	 * 该方法通过指定民俗活动关键字查找民俗活动
	 * 
	 * @param name 民俗活动名称
	 * @param description 民俗活动描述
	 * @return 查询到的民俗活动列表
	 */
	public ArrayList<Activity> findByKeyword(String name,String description){	
		Activity activity=null;
		Node node=null;
		Transaction transaction=new Transaction();
		ArrayList<Activity> resultList=new ArrayList<Activity>();
		ArrayList<Node> nodeList=
			DAOFactory.getNodeDAO().findByKeyword(name,description,"activity",transaction);
		for(Iterator<Node> i=nodeList.iterator();i.hasNext();){
			node=(Node)i.next();
			activity=this.findById(node.getId(),transaction);
			if(activity!=null){
				activity.setActivity(node);
				resultList.add(activity);
			}
		}
		transaction.close();
		return resultList;
	}
	
	/**
	 * the method list2ObjectList of class ActivityDAO
	 * 
	 * 该方法将存有民俗活动信息的HashMap对象数组转换为Activity对象数组
	 * 
	 * @param hashMapList HashMap对象数组
	 * @return Activity对象数组
	 */
	public ArrayList<Activity> list2ObjectList(ArrayList<HashMap> hashMapList){
		Activity tempActivity=null;
		ArrayList<Activity> resultList=new ArrayList<Activity>();
		if(hashMapList.isEmpty())
			return resultList;
		for(Iterator i=hashMapList.iterator();i.hasNext();){
			tempActivity=hashMap2Object((HashMap)i.next());
			if(tempActivity!=null)
				resultList.add(tempActivity);
		}
		return resultList;
	}
	
	/**
	 * the method hashtable2Point of class ActivityDAO
	 * 
	 * 该方法将HashMap类型的对象转换为Activity的对象，并返回Activity的对象.
	 * 
	 * @param hashMap 存储了一个民俗活动信息的HashMap类型的对象
	 * @return Activity的对象.
	 */
	public Activity hashMap2Object(HashMap hashMap){
		if(hashMap==null)
			return null;
		Activity activity=new Activity();
		activity.setSightId((Integer)hashMap.get("SIGHTID"));
		int activityId=(Integer)hashMap.get("ID");
		ArrayList<Spot> spots=DAOFactory.getActivitySpotsDAO().findByActivityId(activityId);
		activity.setSpots(spots);
		return activity;
	}
	
	/**
	 * the method object2HashMap of class ActivityDAO
	 * 
	 * 该方法将参数activity对象转换为存储参数activity对象信息的HashMap对象，并返回
	 * 
	 * @param activity 民俗活动activity对象
	 * @return 存储参数民俗活动activity对象信息的HashMap对象
	 */
	public HashMap object2HashMap(Activity activity){
		HashMap hashMap=new HashMap();
		hashMap.put("ID",activity.getId());
		hashMap.put("SIGHTID", activity.getSightId());
		return hashMap;
	}
	
}